package net.xuele.learn.zk;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.List;

/**
 * Created by huanghao（HIKARI） on 2019/6/11 0011.
 */
public class ZKAPI {
    public static void main(String[] args) throws IOException {
        // 客户端在向zk服务器注册watcher的同时，会watcher对象存储在客户端的watcherManager中。
        // 当服务器触发watcher事件后，会向客户端发送通知，客户端线程会从watcherManager中取出对应的watcher对象来执行回调逻辑
        ZooKeeper zooKeeper = new ZooKeeper("",10,  new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                if (watchedEvent.getType().equals(Event.EventType.NodeCreated)) {
                    System.out.println("OK！");
                }
            }
        },true);
        try {
            /**
             * 关于watcher，zk向客户端发送比如NodeChildrenChanged（子节点变化）事件通知时，仅仅只是发出一个通知，而不会把节点的变化情况
             * 发送给客户端，需要客户端自己重新获取。另外，由于watcher通知是一次性的，即一旦触发一次通知后，该watcher就失效了，因此需要
             * 客户端反复注册watcher！
             */
            List<String> children = zooKeeper.getChildren("/zk", new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if (event.getType().equals(Event.EventType.NodeChildrenChanged)) {
                        System.out.println("children changed!");
                    }
                }
            });
            zooKeeper.getChildren("/zk",true, new CallBack(),"getChildren");
        } catch (KeeperException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class CallBack implements AsyncCallback.Children2Callback{
        // rc：response code、path：当前获取的路径，ctx：getChildren方法传入的ctx参数
        // children：上述getChildren方法是无返回值的，但是此处就是其返回值
        @Override
        public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {

        }
    }
}
